热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

买方|卖方_零知识密钥声明证明

篇首语:本文由编程笔记#小编为大家整理,主要介绍了零知识密钥声明证明相关的知识,希望对你有一定的参考价值。nChain白皮书#0488题为“零知识密钥声明证明”&#

篇首语:本文由编程笔记#小编为大家整理,主要介绍了零知识密钥声明证明相关的知识,希望对你有一定的参考价值。


nChain 白皮书 #0488 题为“零知识密钥声明证明”,介绍了一种零知识证明 (ZKP),可证明与给定公钥对应的私钥满足特定要求,同时保持私钥机密。我们已经实现了它,并将其应用于无需信任地购买比特币荣耀地址。它可以推广到广泛的应用程序,其中可以在相互不信任的各方之间购买秘密信息,而无需受信任的第三方。


零知识密钥声明证明

正如我们之前介绍过的,零知识证明让一方说服另一方他知道验证声明的秘密,同时不透露秘密。零知识密钥声明证明 (ZKKSP) 是一种特殊类型的 ZKP,其中秘密是对应于已知公钥的私钥。私钥满足其他约束,例如散列到给定值。



带哈希的密钥声明

nChain 白皮书介绍了一种有效的 ZKKSP 方法。

与 zk-SNARKS 等一般陈述的零知识证明相比,ZKKSP 具有以下几个显着优势:


  1. ZKKSP不需要一个可信的设置(trusted setup),这是一些 zk-SNARKS 所存在的问题(例如基于配对的)。

  2. zk-SNARKS 中的密钥声明证明需要一个椭圆曲线乘法电路,导致证明生成的计算要求极高,并且证明方的证明密钥过大。相比之下,ZKKSP 通过以下方式删除电路:


    • 在与公钥相同的 ECDSA 椭圆曲线上工作
    • 检查公钥和生成的 zk-proof 之间的一致性:具体来说,检查与 zk-proof 中嵌入的承诺的一致性¹。

在 ZKP 中,语句/计算通常编码在算术电路中,由加法和乘法门组成。如图 1 所示,zk-SNARKS 包含用于散列函数和椭圆曲线乘法的子电路。后面的电路根据已知的 ECDSA 公钥检查一致性。ZKKSP 只使用了哈希电路,去掉了其他的电路,其他的电路至少比哈希电路大一个数量级。有兴趣的读者可以参考白皮书了解更多详细信息,由于篇幅限制,我们在此省略。



图 1:zk-SNARKS² 中声明 1 的复合电路示意图



图 2:ZKKSP³ 中声明 1 的复合电路示意图

实现

我们 fork 了 ZoKrates 来生成 SHA256 的算术电路。修改电路格式后,我们实现了白皮书中列出的剩余密钥声明证明。


ZoKrates

ZoKrates⁴ 是以太坊上 zkSNARKs 的工具箱。它由特定领域的语言、编译器以及用于生成证明和验证证明的智能合约。下面是一个用 ZoKrates 编写的源程序,用于检查 sha256(preimage) == h⁵。

import "hashes/sha256/256bitPadded" as sha256
import "utils/pack/u32/unpack128" as unpack128
import "utils/pack/u32/pack128" as pack128
def main(private field[2] preimage, field h0, field h1):
u32[4] a_bits = unpack128(preimage[0])
u32[4] b_bits = unpack128(preimage[1])
u32[8] privkey = [...a_bits, ...b_bits]
u32[8] res = sha256(privkey)
assert(h0 == pack128(res[0..4]))
assert(h1 == pack128(res[4..8]))
return


sha256.zok: 在zokrate中验证 sha256(preimage) == h

Workflow

证明者按顺序运行以下命令以生成证明。

# 1: compile
> zokrates compile -i sha256.zok
# 2: compute witness: all inputs are in decimal
# first two arguments make up the preimage/private key, which are kept private
# last two arguments make up the hash, which are public
> zokrates compute-witness -a 314077308411032793321278816725012958289 316495952764820137513325325447450102725 67428615251739275197038733346106089224 232995379825841761673536055030921300908
# 3: generate a proof
> zokrates generate-key-proof --output proof.json


证明者生成证明

证明者将生成的证明在 proof.json 中发送给验证者。验证者运行以下命令来检查公钥是否与哈希值匹配。请注意,由于 Fiat-Shamir 启发式,此证明是非交互式的,不需要证明者和验证者之间的交互。

> zokrates verify-key-proof --proof-path proof.json -p 0494d6deea102c33307a5ae7e41515198f6fc19d3b11abeca5bff56f1011ed2d8e3d8f02cbd20e8c53d8050d681397775d0dc8b0ad406b261f9b4c94404201cab3
# if everything goes right, you shall see something like this
Performing verification...
total gates: 199624...
Private key corresponding to public key 0494d6deea102c33307a5ae7e41515198f6fc19d3b11abeca5bff56f1011ed2d8e3d8f02cbd20e8c53d8050d681397775d0dc8b0ad406b261f9b4c94404201cab3 hashes to 32ba476771d01e37807990ead8719f08af494723de1d228f2c2c07cc0aa40bac


验证者验证证明

你可以在我们的 Github 上找到完整的代码。


应用场景:外包虚名地址生成

本节介绍将 ZKKSP 应用于外包比特币荣耀地址生成。

由于搜索荣耀地址可能在计算上很昂贵,因此将搜索外包是很常见的。传统上,要么买方在卖方获得付款之前获得所需价值,要么卖方在释放所需价值之前获得付款,或者他们都必须信任托管服务。通过使用 ZKKSP,可以使荣耀地址的销售变得无需信任。



具有“nChain” 开头的比特币主网荣耀地址

对此的协议详述如下:


  1. 买卖双方就所需的荣耀地址批评规则和价格(BSV)达成一致,并建立沟通渠道(不需要安全)。

  2. 买方生成安全随机密钥 sk_B 和对应的椭圆曲线公钥 pk_B = sk_B * G

  3. 买方将 pk_B 发送给卖方。

  4. 然后,卖方通过更改 i 在派生自 pk = pk_B + i * G 的 Base58 编码地址中执行所需模式的搜索。

  5. 当找到具有所需模式的地址时,卖方保存该值,向买方发出信号并将 pk_S = i * G 和 SHA256 哈希发送给他们。

  6. 卖家还向买家提供了一个 ZKKSP,其原像为 pk_S 对应的私钥。

  7. 买方验证证明,同时确认对应的地址 pk = pk_B + pk_S 符合约定的模式。在这一点上(通过证明),买方知道只要知道 i,他就能够导出荣耀地址 (sk_B + i) 的完整私钥,并且该特定值散列为 h = H(i)

  8. 然后,买方构建一个哈希时间锁定合约 (HTLC) 交易 Tx_1,其中包含一个包含约定费用的输出。此输出可以通过两种方式解锁:


    • 有卖家的签名和哈希原像,i,随时。
    • 指定时间后有买家签名(OP_CLTV⁶)
  9. 然后,买方签署并将此交易广播到区块链,在那里它被挖掘进区块。

  10. 确认后,卖家可以通过提供交易 Tx_2 来在 Tx_1 的输出中索取费用,交易 Tx_2 提供他们的签名和 i 值以解锁散列锁,然后在区块链上显示。

  11. 买家计算最终荣耀地址私钥sk = sk_B + i,其中pk = sk * G

  12. 如果卖家没有在指定的OP_CLTV时间之前提供 i 值,那么买家可以提供他们的签名来收回费用(以防止由于买家不合作而造成费用损失)。

这个交易是完全原子化且无需信任的,这意味着买方只有在提供有效的𝑖 值 时才能获得报酬,该值在区块链上公开披露。此外,由于私钥的拆分,甚至卖方也不知道完整的私钥。


Summary

我们已经展示了如何证明密钥声明,其中秘密私钥哈希散列到给定值。虽然乍一看很原始,但 ZKKSP 非常强大,可以通过两个一般步骤实现许多原子公平交易:


  1. 卖方使用 ZKKSP 向买方证明他知道后者需要的秘密,并且该秘密散列到给定值;
  2. 买方建立了一个智能合约,只有在给出哈希原像时才会支付。

请注意,第 1 步是在链下完成的,计算量很大,而第 2 步是在链上完成的,计算量极轻。

可以应用相同的技术来要求私钥满足其他要求(即电路),例如以给定模式开始或结束。


致谢

这是 nChain Limited 和 sCrypt Inc. 的联合工作。



[1] 这些可以通过电路可满足性的非简洁证明系统或基于离散对数的 SNARK 来实现。我们已经实现了前者。

[2] 内部门仅用于说明目的——实际电路将有 1000 个门。

[3] 电路检查哈希的输出是否等于 EC 公钥:以蓝色突出显示的值向验证者显示,所有其他值都被加密。

[4] ZoKrates — 可扩展的隐私保护链下计算,2018 年

[5] preimage 和 h 都分为两部分,因为基本类型 field 不能容纳 256 位。

[6] BSV 上的“OP_CLTV”


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 可编辑区块链:打破你对“不可篡改”的认知,但这样的区块链还安全吗
    很多人最初了解区块链是什么的时候,除了比特币和中本聪的白皮书,听到最多的说法应该是“去中心化且不可篡改的分布式账本”。由此,区块链“不可篡改”的特性一直都深入人心。不可篡改,我是这 ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 出现_史上最大漏洞出现,你的安卓iPhone电脑都不安全了!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了史上最大漏洞出现,你的安卓iPhone电脑都不安全了!相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 区块链技术的应用案例展示
    按照行业主流观点,区块链技术应用将经历数字货币(1.0)、合约(2.0)和社会治理(3.0)阶段,当前正逐渐迈入合约阶段。一、区块链1.0:数字货币区块链技术伴随比特币应用而生,比 ... [详细]
  • 作者|COLINHARPER译者|火火酱责编|徐威龙封图|CSDN下载于视觉中国“通过使用微支付通道网络,借助当今现代台式计算机上可用的计算能力,比特币 ... [详细]
author-avatar
是冉冉升起的冉啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有